home *** CD-ROM | disk | FTP | other *** search
/ IRIX Base Documentation 2001 May / SGI IRIX Base Documentation 2001 May.iso / usr / share / catman / p_man / cat2 / standard / wait.z / wait
Encoding:
Text File  |  1998-10-20  |  22.5 KB  |  463 lines

  1.  
  2.  
  3.  
  4. WWWWAAAAIIIITTTT((((2222))))                                                                WWWWAAAAIIIITTTT((((2222))))
  5.  
  6.  
  7.  
  8. NNNNAAAAMMMMEEEE
  9.      wait, waitpid, wait3 - wait for child processes to stop or terminate
  10.  
  11. CCCC SSSSYYYYNNNNOOOOPPPPSSSSIIIISSSS
  12.      _####_iiii_nnnn_cccc_llll_uuuu_dddd_eeee _<<<<_ssss_yyyy_ssss_////_tttt_yyyy_pppp_eeee_ssss_...._hhhh_>>>>
  13.      _####_iiii_nnnn_cccc_llll_uuuu_dddd_eeee _<<<<_ssss_yyyy_ssss_////_wwww_aaaa_iiii_tttt_...._hhhh_>>>>
  14.  
  15.      _pppp_iiii_dddd______tttt _wwww_aaaa_iiii_tttt _((((_iiii_nnnn_tttt _****_ssss_tttt_aaaa_tttt_pppp_tttt_rrrr_))))_;;;;
  16.      _pppp_iiii_dddd______tttt _wwww_aaaa_iiii_tttt_pppp_iiii_dddd _((((_pppp_iiii_dddd______tttt _pppp_iiii_dddd_,,,, _iiii_nnnn_tttt _****_ssss_tttt_aaaa_tttt_pppp_tttt_rrrr_,,,, _iiii_nnnn_tttt _oooo_pppp_tttt_iiii_oooo_nnnn_ssss_))))_;;;;
  17.  
  18.      _####_iiii_nnnn_cccc_llll_uuuu_dddd_eeee _<<<<_ssss_yyyy_ssss_////_tttt_yyyy_pppp_eeee_ssss_...._hhhh_>>>>
  19.      _####_iiii_nnnn_cccc_llll_uuuu_dddd_eeee _<<<<_ssss_yyyy_ssss_////_wwww_aaaa_iiii_tttt_...._hhhh_>>>>
  20.      _####_iiii_nnnn_cccc_llll_uuuu_dddd_eeee _<<<<_ssss_yyyy_ssss_////_rrrr_eeee_ssss_oooo_uuuu_rrrr_cccc_eeee_...._hhhh_>>>>
  21.  
  22.      _pppp_iiii_dddd______tttt _wwww_aaaa_iiii_tttt_3333 _((((_iiii_nnnn_tttt _****_ssss_tttt_aaaa_tttt_pppp_tttt_rrrr_,,,, _iiii_nnnn_tttt _oooo_pppp_tttt_iiii_oooo_nnnn_ssss_,,,, _ssss_tttt_rrrr_uuuu_cccc_tttt _rrrr_uuuu_ssss_aaaa_gggg_eeee _****_rrrr_uuuu_ssss_aaaa_gggg_eeee_))))_;;;;
  23.  
  24. DDDDEEEESSSSCCCCRRRRIIIIPPPPTTTTIIIIOOOONNNN
  25.      _wwww_aaaa_iiii_tttt suspends the calling process until one of the immediate children
  26.      terminate, or until a child that is being traced stops because it has hit
  27.      an event of interest.  The _wwww_aaaa_iiii_tttt will return prematurely if a signal is
  28.      received.  If all child processes stopped or terminated prior to the call
  29.      on _wwww_aaaa_iiii_tttt, return is immediate.
  30.  
  31.      If the call is successful, the process ID of a child is returned.
  32.  
  33.      _wwww_aaaa_iiii_tttt_3333 is BSD's extension of _wwww_aaaa_iiii_tttt.  It provides an alternate interface for
  34.      programs that must not block when collecting the status of child
  35.      processes.
  36.  
  37.      _wwww_aaaa_iiii_tttt_pppp_iiii_dddd is POSIX's extension of _wwww_aaaa_iiii_tttt.  The _pppp_iiii_dddd argument specifies a set
  38.      of child processes for which status is requested.  _wwww_aaaa_iiii_tttt_pppp_iiii_dddd only returns
  39.      the status of a child process from this set.
  40.  
  41. PPPPAAAARRRRAAAAMMMMEEEETTTTEEEERRRRSSSS
  42.      ssssttttaaaattttppppttttrrrr ((((aaaallllllll ffffuuuunnnnccccttttiiiioooonnnnssss)))):::: If _s_t_a_t_p_t_r is non-zero, 16 bits of information
  43.      called _s_t_a_t_u_s are stored in the low-order 16 bits of the location pointed
  44.      to by _s_t_a_t_p_t_r.  _S_t_a_t_u_s may be evaluated with the macros described on
  45.      _wwww_ssss_tttt_aaaa_tttt(5).  _S_t_a_t_u_s can be used to differentiate between stopped and
  46.      terminated child processes. If the child process terminated, _s_t_a_t_u_s
  47.      identifies the cause of termination and passes useful information to the
  48.      parent.  _s_t_a_t_u_s is interpreted as follows:
  49.  
  50.           If the child process stopped, the predicate WWWWIIIIFFFFSSSSTTTTOOOOPPPPPPPPEEEEDDDD(*_s_t_a_t_p_t_r)
  51.           will evaluate to non-zero and WWWWSSSSTTTTOOOOPPPPSSSSIIIIGGGG(*_s_t_a_t_p_t_r) will return the
  52.           signal number that caused the process to stop.  (The high-order 8
  53.           bits of _s_t_a_t_u_s will contain the signal number and the low-order 8
  54.           bits are set equal to _WWWW_SSSS_TTTT_OOOO_PPPP_FFFF_LLLL_GGGG.)
  55.  
  56.           If the child process terminated due to an _eeee_xxxx_iiii_tttt call, the predicate
  57.           WWWWIIIIFFFFEEEEXXXXIIIITTTTEEEEDDDD(*_s_t_a_t_p_t_r) will evaluate to non-zero, and
  58.           WWWWEEEEXXXXIIIITTTTSSSSTTTTAAAATTTTUUUUSSSS(*_s_t_a_t_p_t_r) will return the argument that the child
  59.           process passed to ______eeee_xxxx_iiii_tttt or _eeee_xxxx_iiii_tttt, or the value the child process
  60.  
  61.  
  62.  
  63.                                                                         PPPPaaaaggggeeee 1111
  64.  
  65.  
  66.  
  67.  
  68.  
  69.  
  70. WWWWAAAAIIIITTTT((((2222))))                                                                WWWWAAAAIIIITTTT((((2222))))
  71.  
  72.  
  73.  
  74.           returned from _m_a_i_n [see _e_x_i_t(2)].  (The low-order 8 bits of _s_t_a_t_u_s
  75.           will be zero and the high-order 8 bits will contain the low-order 8
  76.           bits of the argument that the child process passed to _eeee_xxxx_iiii_tttt.)
  77.  
  78.           If the child process terminated due to a signal, the predicate
  79.           WWWWIIIIFFFFSSSSIIIIGGGGNNNNAAAALLLLEEEEDDDD(*_s_t_a_t_p_t_r) will evaluate to non-zero, and
  80.           WWWWTTTTEEEERRRRMMMMSSSSIIIIGGGG(*_s_t_a_t_p_t_r) will return the signal number that caused the
  81.           termination.  (The high-order 8 bits of _s_t_a_t_u_s will be zero and the
  82.           low-order 8 bits will contain the number of the signal.)  In
  83.           addition, if _WWWW_CCCC_OOOO_RRRR_EEEE_FFFF_LLLL_GGGG is set, a ``core image'' will have been
  84.           produced [see _s_i_g_n_a_l(2)].
  85.  
  86.      rrrruuuussssaaaaggggeeee ((((wwwwaaaaiiiitttt3333)))):::: If _r_u_s_a_g_e non-zero, a summary of the resources used by
  87.      the terminated process and all its children is returned (this information
  88.      is currently not available for stopped processes).
  89.  
  90.      ppppiiiidddd ((((wwwwaaaaiiiittttppppiiiidddd))))::::
  91.  
  92.           1) If _p_i_d is equal to -1, status is requested for any child process.
  93.           In this respect, _wwww_aaaa_iiii_tttt_pppp_iiii_dddd is then equivalent to _wwww_aaaa_iiii_tttt.
  94.  
  95.           2) If _p_i_d is greater than zero, it specifies the process ID of a
  96.           single child process for which status is requested.
  97.  
  98.           3) If _p_i_d is equal to zero, status is requested for any child
  99.           process whose process group ID is equal to that of the calling
  100.           process.
  101.  
  102.           4) If _p_i_d is less than -1, status is requested for any child process
  103.           whose process group ID is equal to the absolute value of _p_i_d.
  104.  
  105.      ooooppppttttiiiioooonnnnssss ((((wwwwaaaaiiiittttppppiiiidddd aaaannnndddd wwwwaaaaiiiitttt3333)))):::: The _o_p_t_i_o_n_s _a_r_g_u_m_e_n_t is constructed from the
  106.      bitwise inclusive OR of zero or more of the following flags, defined in
  107.      the header <_s_y_s/_w_a_i_t._h>:
  108.  
  109.      WNOHANG        The function will not suspend execution of the calling
  110.                     process if status is not immediately available for one of
  111.                     the child processes.
  112.  
  113.      WUNTRACED      The status of child processes that are stopped due to a
  114.                     SSSSIIIIGGGGTTTTTTTTIIIINNNN, SSSSIIIIGGGGTTTTTTTTOOOOUUUU, SSSSIIIIGGGGTTTTSSSSTTTTPPPP, or SSSSIIIIGGGGSSSSTTTTOOOOPPPP signal, and whose
  115.                     status has not yet been reported since they stopped, are
  116.                     reported to the requesting process.
  117.  
  118.      If a parent process terminates without waiting for its child processes to
  119.      terminate, the parent process ID of each child process is set to 1.  This
  120.      means the initialization process inherits the child processes [see
  121.      _i_n_t_r_o(2)].
  122.  
  123.  
  124.  
  125.  
  126.  
  127.  
  128.  
  129.                                                                         PPPPaaaaggggeeee 2222
  130.  
  131.  
  132.  
  133.  
  134.  
  135.  
  136. WWWWAAAAIIIITTTT((((2222))))                                                                WWWWAAAAIIIITTTT((((2222))))
  137.  
  138.  
  139.  
  140. SIGCLD HANDLING
  141.      IRIX has three distinct version of signal routines: System V (_ssss_iiii_gggg_nnnn_aaaa_llll(2)
  142.      and _ssss_iiii_gggg_ssss_eeee_tttt(2)), 4.3BSD (_ssss_iiii_gggg_nnnn_aaaa_llll(3B) and _ssss_iiii_gggg_vvvv_eeee_cccc(3B)), and POSIX
  143.      (_ssss_iiii_gggg_aaaa_cccc_tttt_iiii_oooo_nnnn(2)).  Each version has a method by which a parent can be
  144.      certain that it waits on all of its children even if they are executing
  145.      concurrently.  In each version, the parent installs a signal handler for
  146.      SSSSIIIIGGGGCCCCLLLLDDDD to wait for its children, but the specific code differs in subtle,
  147.      albeit vital, ways.  Sample programs below are used to illustrate each of
  148.      the three methods.
  149.  
  150.      Note that System V refers to this signal as SSSSIIIIGGGGCCCCLLLLDDDD, whereas BSD calls it
  151.      SSSSIIIIGGGGCCCCHHHHLLLLDDDD.  For compatibility with both systems they are defined to be the
  152.      same signal number, and may therefore be used interchangeably.
  153.  
  154.      SSSSyyyysssstttteeeemmmm VVVV:::: System V's SSSSIIIIGGGGCCCCLLLLDDDD mechanism guarantees that no SSSSIIIIGGGGCCCCLLLLDDDD signals
  155.      will be lost.  It accomplishes this by forcing the process to reinstall
  156.      the handler (via _ssss_iiii_gggg_nnnn_aaaa_llll or _ssss_iiii_gggg_ssss_eeee_tttt calls) when leaving the handler.  Note
  157.      that whereas _ssss_iiii_gggg_nnnn_aaaa_llll(2) sets the signal disposition back to SSSSIIIIGGGG____DDDDFFFFLLLL each
  158.      time the handler is called, _ssss_iiii_gggg_ssss_eeee_tttt(2) keeps it installed, so SSSSIIIIGGGGCCCCLLLLDDDD is
  159.      the only signal that demands this reinstallation, and that only because
  160.      the installation call allows the kernel to check for additional instances
  161.      of the signal that occurred while the process was executing in the
  162.      handler.  The code below is the System V example.  Note that the
  163.      _ssss_iiii_gggg_pppp_aaaa_uuuu_ssss_eeee(2) creates a window during which SSSSIIIIGGGGCCCCLLLLDDDD is not blocked, allowing
  164.      the parent to enter its handler.
  165.  
  166.           /*
  167.            * System V example of wait-in-SIGCLD-handler usage
  168.            */
  169.           #include <signal.h>
  170.           #include <stdio.h>
  171.           #include <sys/wait.h>
  172.  
  173.           static void handler(int);
  174.  
  175.           #define NUMKIDS   4
  176.           volatile int kids = NUMKIDS;
  177.  
  178.           main()
  179.           {
  180.               int i, pid;
  181.  
  182.               sigset(SIGCLD, handler);
  183.               sighold(SIGCLD);
  184.               for (i = 0; i < NUMKIDS; i++) {
  185.                if (fork() == 0) {
  186.                    printf("Child %d\n", getpid());
  187.                    exit(0);
  188.                }
  189.               }
  190.               while (kids > 0) {
  191.                sigpause(SIGCLD);
  192.  
  193.  
  194.  
  195.                                                                         PPPPaaaaggggeeee 3333
  196.  
  197.  
  198.  
  199.  
  200.  
  201.  
  202. WWWWAAAAIIIITTTT((((2222))))                                                                WWWWAAAAIIIITTTT((((2222))))
  203.  
  204.  
  205.  
  206.               sighold(SIGCLD);
  207.               }
  208.           }
  209.  
  210.           static void
  211.           handler(int sig)
  212.           {
  213.               int pid, status;
  214.  
  215.               printf("Parent (%d) in handler, ", getpid());
  216.               pid = wait(&status);
  217.               kids--;
  218.               printf("child %d, now %d left\n", pid, kids);
  219.               /*
  220.                * Now reinstall handler & cause SIGCLD to be re-raised
  221.                * if any more children exited while we were in here.
  222.                */
  223.               sigset(SIGCLD, handler);
  224.           }
  225.  
  226.  
  227.      BBBBSSSSDDDD:::: 4.3BSD solved this problem differently: instead of guaranteeing that
  228.      no SSSSIIIIGGGGCCCCHHHHLLLLDDDD signals are lost, it provides a WWWWNNNNOOOOHHHHAAAANNNNGGGG option to _wwww_aaaa_iiii_tttt_3333 that
  229.      allows parent processes to do non-blocking waits in loops, until no more
  230.      stopped or zombied children exist.  Note that the handler must be able to
  231.      deal with the case in which no applicable children exist; if one or more
  232.      children exit while the parent is in the handler, all may get reaped, yet
  233.      if one or more SSSSIIIIGGGGCCCCHHHHLLLLDDDD signals arrived while the parent was in its
  234.      handler, the signal will remain pending, the parent will reenter the
  235.      handler, and the _wwww_aaaa_iiii_tttt_3333 call will return 0.  Note that it is not necessary
  236.      to call _ssss_iiii_gggg_vvvv_eeee_cccc upon exit from the handler.
  237.  
  238.           /*
  239.            * BSD example of wait3-in-SIGCHLD handler usage
  240.            */
  241.  
  242.           #define _BSD_SIGNALS
  243.           #include <signal.h>
  244.           #include <stdio.h>
  245.           #include <sys/wait.h>
  246.  
  247.           static int handler(int);
  248.  
  249.           #define NUMKIDS   4
  250.           volatile int kids = NUMKIDS;
  251.  
  252.           main()
  253.           {
  254.               int i, pid;
  255.               struct sigvec vec;
  256.  
  257.               vec.sv_handler = handler;
  258.  
  259.  
  260.  
  261.                                                                         PPPPaaaaggggeeee 4444
  262.  
  263.  
  264.  
  265.  
  266.  
  267.  
  268. WWWWAAAAIIIITTTT((((2222))))                                                                WWWWAAAAIIIITTTT((((2222))))
  269.  
  270.  
  271.  
  272.               vec.sv_mask = sigmask(SIGCHLD);
  273.               vec.sv_flags = 0;
  274.  
  275.               sigvec(SIGCHLD, &vec, NULL);
  276.               sigsetmask(sigmask(SIGCHLD));
  277.               for (i = 0; i < NUMKIDS; i++) {
  278.                if (fork() == 0) {
  279.                    printf("Child %d\n", getpid());
  280.                    exit(0);
  281.                }
  282.               }
  283.               while (kids > 0) {
  284.                sigpause(0);
  285.               }
  286.           }
  287.  
  288.           static int
  289.           handler(int sig)
  290.           {
  291.               int pid;
  292.               int status;
  293.  
  294.               printf("Parent (%d) in handler, ", getpid());
  295.               while ((pid = wait3(&status, WNOHANG, NULL)) > 0) {
  296.                kids--;
  297.                printf("child %d, now %d left\n", pid, kids);
  298.               }
  299.           }
  300.  
  301.  
  302.      PPPPOOOOSSSSIIIIXXXX:::: POSIX improved on the BSD method by providing _wwww_aaaa_iiii_tttt_pppp_iiii_dddd, that allows
  303.      a parent to wait on a particular child process if desired.  In addition,
  304.      the IRIX implementation of _ssss_iiii_gggg_aaaa_cccc_tttt_iiii_oooo_nnnn(2) checks for zombied children upon
  305.      exit from the system call if the specified signal was SSSSIIIIGGGGCCCCLLLLDDDD and the
  306.      disposition of the signal handling was changed.  If zombied children
  307.      exist, another SSSSIIIIGGGGCCCCLLLLDDDD is raised.  This solves the problem that occurs
  308.      when a parent creates children, but a module that it links with
  309.      (typically a libc routine such as _ssss_yyyy_ssss_tttt_eeee_mmmm(3)) creates and waits on its own
  310.      children.
  311.  
  312.      Two problems have classically arisen in such a scheme: 1) until the
  313.      advent of _wwww_aaaa_iiii_tttt_pppp_iiii_dddd, the called routine could not specify which children to
  314.      wait on; it therefore looped, waiting and discarding children until the
  315.      one (or ones) it had created terminated, and 2) if the called routine
  316.      changed the disposition of SSSSIIIIGGGGCCCCLLLLDDDD and then restored the previous handler
  317.      upon exit, children of the parent (calling) process that had terminated
  318.      while the called routine executed would be missed in the parent, because
  319.      the called routine's SSSSIIIIGGGGCCCCLLLLDDDD handler would reap and discard those
  320.      children.  The addition of _wwww_aaaa_iiii_tttt_pppp_iiii_dddd and the IRIX implementation of
  321.      _ssss_iiii_gggg_aaaa_cccc_tttt_iiii_oooo_nnnn solves both of these problems.  Note that neither the BSD nor
  322.      the System V signal routines on IRIX have these properties, in the
  323.      interests of compatibility.
  324.  
  325.  
  326.  
  327.                                                                         PPPPaaaaggggeeee 5555
  328.  
  329.  
  330.  
  331.  
  332.  
  333.  
  334. WWWWAAAAIIIITTTT((((2222))))                                                                WWWWAAAAIIIITTTT((((2222))))
  335.  
  336.  
  337.  
  338.      WARNING:  programs that install SSSSIIIIGGGGCCCCLLLLDDDD handlers that set flags instead of
  339.      executing _wwww_aaaa_iiii_tttt_pppp_iiii_dddds and then attempt to restore the previous signal
  340.      handler (via _ssss_iiii_gggg_aaaa_cccc_tttt_iiii_oooo_nnnn) upon return from the handler will create infinite
  341.      loops.
  342.  
  343.           /*
  344.           * POSIX example of waitpid-in-SIGCHLD handler usage
  345.           */
  346.  
  347.           #include <signal.h>
  348.           #include <stdio.h>
  349.           #include <sys/wait.h>
  350.  
  351.           static void handler(int);
  352.  
  353.           #define NUMKIDS   4
  354.           volatile int kids = NUMKIDS;
  355.  
  356.           /*
  357.           * If waitpid's 1st argument is -1, it waits for any child.
  358.           */
  359.           #define ANYKID -1
  360.  
  361.           main()
  362.           {
  363.               int i;
  364.               pid_t pid;
  365.               struct sigaction act;
  366.               sigset_t set, emptyset;
  367.  
  368.               act.sa_handler = handler;
  369.               sigemptyset(&act.sa_mask);
  370.               sigaddset(&act.sa_mask, SIGCHLD);
  371.               act.sa_flags = 0;
  372.  
  373.               sigaction(SIGCHLD, &act, NULL);
  374.               sigemptyset(&set);
  375.               sigemptyset(&emptyset);
  376.               sigaddset(&set, SIGCHLD);
  377.               sigprocmask(SIG_BLOCK, &set, NULL);
  378.               setbuf(stdout, NULL);
  379.  
  380.               for (i = 0; i < NUMKIDS; i++) {
  381.                if (fork() == 0) {
  382.                    printf("Child %d\n", getpid());
  383.                    exit(0);
  384.                }
  385.               }
  386.               while (kids > 0) {
  387.                sigsuspend(&emptyset);
  388.               }
  389.           }
  390.  
  391.  
  392.  
  393.                                                                         PPPPaaaaggggeeee 6666
  394.  
  395.  
  396.  
  397.  
  398.  
  399.  
  400. WWWWAAAAIIIITTTT((((2222))))                                                                WWWWAAAAIIIITTTT((((2222))))
  401.  
  402.  
  403.  
  404.           static void
  405.           handler(int sig)
  406.           {
  407.               pid_t pid;
  408.               int status;
  409.  
  410.               printf("Parent (%d) in handler, ", getpid());
  411.               pid = waitpid(ANYKID, &status, WNOHANG);
  412.               while (pid > 0) {
  413.                kids--;
  414.                printf("child %d, now %d left\n", pid, kids);
  415.                pid = waitpid(ANYKID, &status, WNOHANG);
  416.               }
  417.           }
  418.  
  419.  
  420. DDDDIIIIAAAAGGGGNNNNOOOOSSSSTTTTIIIICCCCSSSS
  421.      _wwww_aaaa_iiii_tttt fails and its actions are undefined if _s_t_a_t_p_t_r points to an invalid
  422.      address.  If _wwww_aaaa_iiii_tttt, _wwww_aaaa_iiii_tttt_3333, or _wwww_aaaa_iiii_tttt_pppp_iiii_dddd return due to a stopped or
  423.      terminated child process, the process ID of the child is returned to the
  424.      calling process.  _wwww_aaaa_iiii_tttt_3333 and _wwww_aaaa_iiii_tttt_pppp_iiii_dddd return 0 if WWWWNNNNOOOOHHHHAAAANNNNGGGG is specified and
  425.      there are currently no stopped or exited children (although children DO
  426.      exist).  Otherwise, a value of -1 is returned and _e_r_r_n_o is set to
  427.      indicate the error:
  428.  
  429.      [EINTR]        The calling process received a signal.
  430.  
  431.      [ECHILD]       The calling process has no existing unwaited-for child
  432.                     processes.
  433.  
  434.      [ECHILD]       The process or process group specified by _p_i_d does not
  435.                     exist or is not a child of the calling process (_wwww_aaaa_iiii_tttt_pppp_iiii_dddd
  436.                     only).
  437.  
  438.      [EFAULT]       The _r_u_s_a_g_e or _s_t_a_t_p_t_r arguments (where applicable) point
  439.                     to illegal addresses.
  440.  
  441.      [EINVAL]       The value of the _o_p_t_i_o_n_s argument is not valid (_wwww_aaaa_iiii_tttt_pppp_iiii_dddd
  442.                     and _wwww_aaaa_iiii_tttt_3333 only).
  443.  
  444. SSSSEEEEEEEE AAAALLLLSSSSOOOO
  445.      exec(2), exit(2), fork(2), intro(2), pause(2), ptrace(2), signal(2),
  446.      sigset(2), sigpause(2), sigaction(2), sigsuspend(2), sigprocmask(2),
  447.      signal(3B), sigvec(3B), sigpause(3B), wait(3b), getrusage(3), wstat(5).
  448.  
  449. NNNNOOOOTTTTEEEE
  450.      Currently, _wwww_aaaa_iiii_tttt_3333 returns zero for the _r_u__i_x_r_s_s, _r_u__i_d_r_s_s and _r_u__i_s_r_s_s
  451.      fields in _r_u_s_a_g_e.
  452.  
  453.  
  454.  
  455.  
  456.  
  457.  
  458.  
  459.                                                                         PPPPaaaaggggeeee 7777
  460.  
  461.  
  462.  
  463.